package class6;

import java.util.ArrayList;

public class Arraylist {
    public static void main(String[] args) {
        //ArrayList类似于vector，如果不指定类型，可以存储任意类型
        //也可以指定类型，只能存储指定类型
        //对象存储在堆内存中，集合实际保存的是指向堆中对象的引用（内存地址）。通过这个引用，程序能找到并操作堆里的具体对象
        ArrayList list=new ArrayList();
        list.add("hello");//add函数默认添加到最后
        list.add(123);
        list.add(45.67);
        System.out.println(list);//居然能直接打印

        ArrayList<String> list2=new ArrayList<String>();//只能存储字符串
        ArrayList<String> list3=new ArrayList<>();//或者也可以这样写
        //注意点：集合和泛型不支持基本数据类型（如 int、double 等），只能支持引用数据类型（如类、接口等）。
        ArrayList<Integer> list6=new ArrayList<>();
        ArrayList<Double> list7=new ArrayList<>();
        //ArrayList<int> list6=new ArrayList<>();错误写法
        //ArrayList<double> list7=new ArrayList<>();错误写法
        //如果想要集合能存储任意类型的元素，推荐写成 ArrayList<Object> list = new ArrayList<>();，
        //因为 Object 是所有类的父类，所以这样的 ArrayList 可以存储任何引用数据类型的对象

        list2.add(0,"hello");//指定位置添加元素，后面的元素依次后移
        list2.add("hello");
        list2.add("world");
        list3=list2;//是list2把指针赋值给list3
        System.out.println(list2.get(0));//通过get方法获取指定位置的元素
//        System.out.println(list2[0]);//不能通过下标访问

        System.out.println(list2.size());//获取元素个数
        list2.remove(0);//删除指定位置的元素，后面的元素依次前移,
        list2.remove("hello");// 如果有多个相同元素，只删除第一个
        System.out.println(list2);

        list2.set(0,"黑马");
        System.out.println(list2);
        System.out.println(list3);


        //如何删除集合中所有包含关键字的元素？
        ArrayList<String> list4=new ArrayList<>();
        list4.add("hello");
        list4.add("world");
        list4.add("hello");
        list4.add("java");
        list4.add("hello");
        for(int i=0;i<list4.size();i++)
        {
            String tmp=list4.get(i);
            if(tmp.contains("o")) list4.remove(i--);
        }
        System.out.println(list4);
        //上面的方法有问题，因为删除元素后，后面的元素会前移，导致有些元素没有被检查到
        //正确的方法是从后往前删除或者每次删除后i--
    }
}
